package cn.qlin.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import cn.qlin.mvc.orm.util.BeanOperate;


public class Reflect {
	private Class<?> clz = null;
	private Object obj = null;
	
	/**
	 * 描述： 反射工具类构造函数
	 * @author 吴延麟
	 * */
	public Reflect() {
	}
	/**
	 * 描述： 反射工具类带参数构造函数
	 * @author 吴延麟
	 * @param clz 类的对象
	 * */
	public Reflect(Class<?> clz) {
		this.clz = clz;
		try {
			obj = clz.newInstance();
		} catch (InstantiationException e) {
			System.out.println("bean初始化失败，可能你这不是标准bean");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			System.out.println("由于权限问题bean初始化失败，请检查构造函数和方法");
			e.printStackTrace();
		}
	}
	public Class<?> getClz() {
		return clz;
	}
	/**
	 * 描述： 设置类对象
	 * @author 吴延麟
	 * @param clz 类的字节码
	 * */
	public void setClz(Class<?> clz) {
		this.clz = clz;
		try {
			obj = clz.newInstance();
		} catch (InstantiationException e) {
			System.out.println("实例化异常，可能是你的bean没有无参构造函数");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			System.out.println("安全权限异常，可能是你的bean是私有的");
			e.printStackTrace();
		}
	}
	/**
	 * 描述：设置对象实例 用于获取对象值
	 * @author 吴延麟
	 * */
	public void setObj(Object obj) {
		this.obj = obj;
	}
	/**
	 * 描述： 获取创建的类实例
	 * @author 吴延麟
	 * */
	public Object getObj() {
		return obj;
	}
	/**
	 * 描述： 获取类的所有字段
	 * @author 吴延麟
	 * */
	public Field[] getMethodNames(){
		return clz.getDeclaredFields();
	}
	/**
	 * 描述：通过实例设置值
	 * @author 吴延麟
	 * @throws Exception 
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * */
	public Reflect set(Field field,Object value) throws NoSuchMethodException, SecurityException, Exception{
		Method method = null;			
		method = clz.getMethod(BeanOperate.getSetMethodName(field.getName()), field.getType());
		method.invoke(obj,value);
		return this;
	}
	/**
	 * 描述：通过实例获取值
	 * @author 吴延麟
	 * @throws Exception 
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * */
	public Object get(Field field) throws NoSuchMethodException, SecurityException, Exception{
		Method method = null;
		Object obj = null;			
		method = clz.getMethod(BeanOperate.getGetMethodName(field.getName()));
		obj = method.invoke(obj);
		return obj;
	}
	/**
	 * 描述： 获取属性类型
	 * @author 吴延麟
	 * */
	public static String getFieldType(Field field){
		try {	
			String fieldtype = field.getGenericType().toString();
			if(fieldtype.equals("class java.lang.Integer")||fieldtype.equals("int")){
				return "int";
			}
			else if(fieldtype.equals("class java.lang.Double")||fieldtype.equals("double")){
				return "double";
			}
			else if(fieldtype.equals("class java.lang.String")){
				return "string";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "null";
	}
	/**
	 * 描述： 获取属性的值
	 * @author 吴延麟
	 * */
	public static Object getFieldValue(Object obj1,Field field){
		Method method = null;
		Object objtemp = null;
		try {
			method = obj1.getClass().getMethod(BeanOperate.getGetMethodName(field.getName()));
			objtemp = method.invoke(obj1);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return objtemp;
	}
	
	
}
